<?php
/* 
 * Sistema Fácil - Desenvolvimento rápido de softwares baseado em sentenças em português
 * Copyright (C) 2010 Rodrigo Caldeira de Paula Lima 
 * 
 * Este arquivo é parte do Sistema Fácil
 *
 * Sistema Fácil é um software livre; você pode redistribui-lo e/ou 
 * modifica-lo dentro dos termos da Licença Pública Geral GNU como 
 * publicada pela Fundação do Software Livre (FSF); na versão 2 da 
 * Licença, ou (na sua opnião) qualquer versão.
 * 
 * Este programa é distribuido na esperança que possa ser  util, 
 * mas SEM NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer
 * MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a
 * Licença Pública Geral GNU para maiores detalhes.
 *
 * Você deve ter recebido uma cópia da Licença Pública Geral GNU
 * junto com este programa, se não, escreva para a Fundação do Software
 * Livre(FSF) Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA 
 * */

class Campo {
	var $nome;
	var $tipo;
	var $opcional;
	var $tipoConfig;
	var $tabela;
	var $valor;
	var $campoAnterior;
	var $mostrarCampo;
	var $configBase;
	var $editavel;
	var $exibir;
	var $valorPadrao;
	var $condicoesExibicao;
	var $condicoesEdicao;
	var $execucoesWorkflow;
	
	function __construct() {
		$this->editavel = true;
		$this->exibir = true;
		$this->execucoesWorkflow = array();
		$this->condicoesExibicao = array();
		$this->condicoesEdicao = array();
	}
	
	function verificarCondicoes() {
		if (count($this->condicoesExibicao) > 0) {
			$condicoesOU = false;
			foreach ($this->condicoesExibicao as $condicoes) {
				$condicoesE = true;
				foreach ($condicoes as $condicao) {
					$condicoesE &= $condicao->verificar();
				}
				$condicoesOU |= $condicoesE;
			}
			$this->exibir = $condicoesOU;
		}
		if (count($this->condicoesEdicao) > 0) {
			$condicoesOU = false;
			foreach ($this->condicoesEdicao as $condicoes) {
				$condicoesE = true;
				foreach ($condicoes as $condicao) {
					$condicoesE &= $condicao->verificar();
				}
				$condicoesOU |= $condicoesE;
			}
			$this->editavel = $condicoesOU;
		}
		if (!$this->opcional) {
			$this->opcional = !($this->exibir && $this->editavel);
		}
	}
	
	function renderizar() {
		$this->verificarCondicoes();
		switch ($this->tipoConfig) {
			case "Expressão Numérica":
				return $this->nome . " " . $this->valor . "<input type='hidden' name='" . str_replace(" ","_",$this->tabela->nome . "." . $this->nome) . "' id='" . str_replace(" ","_",$this->tabela->nome . "_" . $this->nome) . "' value='" . $this->valor . "'/>";
			case "Texto":
				if ($this->exibir) {
					if ($this->editavel) {
						return $this->nome . " <input type='text' class='campo texto " . (!$this->opcional ? " validar " : "") . "' name='" . str_replace(" ","_",$this->tabela->nome . "." . $this->nome) . "' id='" . str_replace(" ","_",$this->tabela->nome . "_" . $this->nome) . "' value='" . $this->valor . "'/>";
					} else {
						return $this->nome . " " . $this->valor . "<input type='hidden' name='" . str_replace(" ","_",$this->tabela->nome . "." . $this->nome) . "' id='" . str_replace(" ","_",$this->tabela->nome . "_" . $this->nome) . "' value='" . $this->valor . "' " . (!$this->opcional ? " class='validar' " : "") . "/>";
					}
				} else {
					return "<input type='hidden' name='" . str_replace(" ","_",$this->tabela->nome . "." . $this->nome) . "' id='" . str_replace(" ","_",$this->tabela->nome . "_" . $this->nome) . "' value='" . $this->valor . "' " . (!$this->opcional ? " class='validar' " : "") . "/>";
				}
			case "Senha":
				if ($this->exibir) {
					if ($this->editavel) {
						if ($this->valor && $this->tabela->id) $this->valor = "SENHAPADRAO";
						return $this->nome . " <input type='password' class='campo senha " . (!$this->opcional ? " validar " : "") . "' name='" . str_replace(" ","_",$this->tabela->nome . "." . $this->nome) . "' id='" . str_replace(" ","_",$this->tabela->nome . "_" . $this->nome) . "' value='" . $this->valor . "'/>";
					}
				} else {
					return $this->nome . " *******";
				}
			case "Texto Grande":
				if ($this->exibir) {
					if ($this->editavel) {
						return $this->nome . " <textarea  class='campo texto_grande " . (!$this->opcional ? " validar " : "") . "' name='" . str_replace(" ","_",$this->tabela->nome . "." . $this->nome) . "' id='" . str_replace(" ","_",$this->tabela->nome . "_" . $this->nome) . "'>" . $this->valor . "</textarea>";
					} else {
						return $this->nome . " " . $this->valor . "<input type='hidden' name='" . str_replace(" ","_",$this->tabela->nome . "." . $this->nome) . "' id='" . str_replace(" ","_",$this->tabela->nome . "_" . $this->nome) . "' value='" . $this->valor . "' " . (!$this->opcional ? " class='validar' " : "") . "/>";
					}
				} else {
					return "<input type='hidden' name='" . str_replace(" ","_",$this->tabela->nome . "." . $this->nome) . "' id='" . str_replace(" ","_",$this->tabela->nome . "_" . $this->nome) . "' value='" . $this->valor . "' " . (!$this->opcional ? " class='validar' " : "") . "/>";
				}
			case "Número":
				if ($this->exibir) {
					if ($this->editavel) {
						return $this->nome . " <input type='text' class='campo numero " . (!$this->opcional ? " validar " : "") . "' onblur='javascript:filtraNumero(this)' onkeyup='javascript:filtraNumero(this)' name='" . str_replace(" ","_",$this->tabela->nome . "." . $this->nome) . "' id='" . str_replace(" ","_",$this->tabela->nome . "_" . $this->nome) . "' value='" . $this->valor . "'/>";
					} else {
						return $this->nome . " " . $this->valor . "<input type='hidden' name='" . str_replace(" ","_",$this->tabela->nome . "." . $this->nome) . "' id='" . str_replace(" ","_",$this->tabela->nome . "_" . $this->nome) . "' value='" . $this->valor . "' " . (!$this->opcional ? " class='validar' " : "") . "/>";
					}
				} else {
					return "<input type='hidden' name='" . str_replace(" ","_",$this->tabela->nome . "." . $this->nome) . "' id='" . str_replace(" ","_",$this->tabela->nome . "_" . $this->nome) . "' value='" . $this->valor . "' " . (!$this->opcional ? " class='validar' " : "") . "/>";
				}
			case "Número Decimal":
				if ($this->exibir) {
					if ($this->editavel) {	
						return $this->nome . " <input type='text' class='campo numero_decimal " . (!$this->opcional ? " validar " : "") . "' onblur='javascript:filtraNumeroDecimal(this)' onkeyup='javascript:filtraNumeroDecimal(this)' name='" . str_replace(" ","_",$this->tabela->nome . "." . $this->nome) . "' id='" . str_replace(" ","_",$this->tabela->nome . "_" . $this->nome) . "' value='" . str_replace(".",",",$this->valor) . "'/>";
					} else {
						return $this->nome . " " . $this->valor . "<input type='hidden' name='" . str_replace(" ","_",$this->tabela->nome . "." . $this->nome) . "' id='" . str_replace(" ","_",$this->tabela->nome . "_" . $this->nome) . "' value='" . $this->valor . "' " . (!$this->opcional ? " class='validar' " : "") . "/>";
					}
				} else {
					return "<input type='hidden' name='" . str_replace(" ","_",$this->tabela->nome . "." . $this->nome) . "' id='" . str_replace(" ","_",$this->tabela->nome . "_" . $this->nome) . "' value='" . $this->valor . "' " . (!$this->opcional ? " class='validar' " : "") . "/>";
				}
			case "Data":
				if ($this->exibir) {
					if ($this->editavel) {
						$campoData = $this->nome . " <input type='text' class='campo data' readonly='readonly' id='data" . str_replace(" ","_",$this->tabela->nome . "_" . $this->nome) . "' value='" . $this->valor . "'><input type='hidden' name='" . str_replace(" ","_",$this->tabela->nome . "." . $this->nome) . "' id='" . str_replace(" ","_",$this->tabela->nome . "_" . $this->nome) . "' value='" . $this->valor . "' " . (!$this->opcional ? " class='validar' " : "") . "/>";
						$campoData .= "<script type='text/javascript'>$('#data" . str_replace(" ","_",$this->tabela->nome . "_" . $this->nome) . "').datepicker({ altField: '#" . str_replace(" ","_",$this->tabela->nome . "_" . $this->nome) . "', altFormat: 'yy-mm-dd', dateFormat: 'yy-mm-dd'});</script>"; 
						return $campoData;
					} else { 
						return $this->nome . " " . $this->valor . "<input type='hidden' name='" . str_replace(" ","_",$this->tabela->nome . "." . $this->nome) . "' id='" . str_replace(" ","_",$this->tabela->nome . "_" . $this->nome) . "' value='" . $this->valor . "' " . (!$this->opcional ? " class='validar' " : "") . "/>";
				}
				} else {
					return "<input type='hidden' name='" . str_replace(" ","_",$this->tabela->nome . "." . $this->nome) . "' id='" . str_replace(" ","_",$this->tabela->nome . "_" . $this->nome) . "' value='" . $this->valor . "' " . (!$this->opcional ? " class='validar' " : "") . "/>";
				}
			case "Sim ou Não":
				$checked = "";
				if ($this->valor) $checked = "checked='checked'";
				return "<input type='checkbox' value='1' class='campo checkbox' name='" . str_replace(" ","_",$this->tabela->nome . "." . $this->nome) . "[]' id='" . str_replace(" ","_",$this->tabela->nome . "_" . $this->nome) . "' $checked/><input type='hidden' value='0' name='" . str_replace(" ","_",$this->tabela->nome . "." . $this->nome) . "[]' id='" . str_replace(" ","_",$this->tabela->nome . "_" . $this->nome) . "_hidden'/>" . $this->nome;
			case "Arquivo":
				if ($this->exibir) {
					if ($this->editavel) {
						$campoArquivo = $this->nome . " <input type='file' class='campo arquivo " . (!$this->opcional ? " validar " : "") . "' name='" . str_replace(" ","_",$this->tabela->nome . "." . $this->nome) . "' id='" . str_replace(" ","_",$this->tabela->nome . "_" . $this->nome) . "' value='" . $this->valor . "'/>";
						if ($this->valor) {
							$campoArquivo .= " Arquivo atual: <a href='#' onclick='javascript:request(\"" . $this->tabela->nome . "\",\"Download\",\"" . $this->tabela->id . "\",\"" . $this->valor . "\");return false;'>" . $this->valor . "</a>";
						}
						return $campoArquivo;
					} 
				} else { 
					return $this->nome . " <a href='#' onclick='javascript:request(\"" . $this->tabela->nome . "\",\"Download\",\"" . $this->tabela->id . "\",\"" . $this->valor . "\");return false;'>" . $this->valor . "</a>";
				}
			default:
				if (strpos($this->tipoConfig, "Checagem de") !== FALSE) {
					$nomeTabelaChecagem = trim(str_replace("Checagem de", "", $this->tipoConfig));
					$campoDeChecagem = "";
					foreach ($this->configBase->tabelas as $tabela) {
						if ($tabela->nome == $nomeTabelaChecagem) {
							$query = "SELECT id, `" . $this->tabela->nome . "`, `" . $tabela->campoParaExibicao . "` FROM `" . $nomeTabelaChecagem . "`";
							if (!$this->editavel) {
								$query .= " WHERE `" . $this->tabela->nome . "` = " . $this->tabela->id;
							}
							//echo $query;
							if ($result = mysql_query($query, $this->configBase->conn)) {
								$campoDeChecagem = $nomeTabelaChecagem . "<br/>";
								while ($registro = mysql_fetch_array($result)) {
									$checked = "";
									if ($this->tabela->id == $registro[$this->tabela->nome]) {
										$checked = "checked";
									}
									if ($this->editavel) {
										$campoDeChecagem .= "<input type='checkbox' name='" . str_replace(" ","_",$this->tabela->nome . "." . $this->nome) . "[]' id=" . str_replace(" ","_",$this->tabela->nome . "." . $this->nome) . " value='" . $registro['id'] . "' " . $checked . "/>" . $registro[$tabela->campoParaExibicao] . "<br/>";
									} else if ($this->exibir) {
										$campoDeChecagem .= $registro[$tabela->campoParaExibicao] . "<br/>";
									}
								}
							}
							break;
						}
					}
					return $campoDeChecagem;
				} else {
					foreach ($this->configBase->tabelas as $tabela) {
						if ($tabela->nome == $this->tipoConfig) {
							if ($this->valorPadrao && $this->valor == $this->valorPadrao) {
								$query = "SELECT id FROM `" . $this->tipoConfig . "` WHERE `" . $this->mostrarCampo . "` = " . $this->valorPadrao;
								if ($result = mysql_query($query, $this->configBase->conn)) {
									$this->valor = mysql_result($result, 0); 
								}
							}
							$campoDeTabela = $this->nome;
							if ($this->exibir) {
								if ($this->editavel) {
									$campoDeTabela .= " <select class='campo select " . (!$this->opcional ? " validar " : "") . "' name='" . str_replace(" ","_",$this->tabela->nome . "." . $this->nome) . "' id='" . str_replace(" ","_",$this->tabela->nome . "_" . $this->nome) . "'>";
									$campoDeTabela .= "<option value=''>Selecione</option>";
									$query = "SELECT id, `" . $this->mostrarCampo . "` FROM `" . $this->tipoConfig . "`";
									$result = mysql_query($query, $this->configBase->conn);
									while ($registro = mysql_fetch_array($result)) {
										$selected = $this->valor == $registro['id'] ? "selected" : "";
										$campoDeTabela .= "<option value='" . $registro['id'] . "' $selected>" . $registro[$this->mostrarCampo] . "</option>";
									}
									$campoDeTabela .= "</select>";
								} else {
									if ($this->valor) {
										$query = "SELECT `" . $this->mostrarCampo . "` FROM `" . $tabela->nome . "` WHERE id = " . $this->valor;
										$result = mysql_query($query, $this->configBase->conn);
										$valor = mysql_result($result, 0);
										$campoDeTabela .= " " . $valor . "<input type='hidden' name='" . str_replace(" ","_",$this->tabela->nome . "." . $this->nome) . "' id='" . str_replace(" ","_",$this->tabela->nome . "_" . $this->nome) . "' value='" . $this->valor . "' " . (!$this->opcional ? " class='validar' " : "") . "/>";
									}
								}
							} else {
							if ($this->valor) {
									$query = "SELECT `" . $this->mostrarCampo . "` FROM `" . $tabela->nome . "` WHERE id = " . $this->valor;
									$result = mysql_query($query, $this->configBase->conn);
									$valor = mysql_result($result, 0);
									$campoDeTabela = "<input type='hidden' name='" . str_replace(" ","_",$this->tabela->nome . "." . $this->nome) . "' id='" . str_replace(" ","_",$this->tabela->nome . "_" . $this->nome) . "' value='" . $this->valor . "' " . (!$this->opcional ? " class='validar' " : "") . "/>";
								}
							}
							return $campoDeTabela;
						}
					}
				}
				break;
		}
	}
	
	function analisarValorPadrao() {
		switch ($this->tipoConfig) {
			case "Expressão Numérica":
				$this->valor = $this->executarExpressao();
				break;
			default:
				$this->valor = $this->valorPadrao;
				break;
		}
		//$this->valor = $this->valorPadrao;
	}
	
	function executarExpressao() {
		$valorExpressao = 0;
		$expressao = "";
		$valorPadrao = $this->valorPadrao;
		$i = 0;
		
		while ($i < strlen($valorPadrao)) {
			$caracter = $valorPadrao[$i];
			$campoPesquisa = "";
			while ($caracter != '+' && $caracter != '-' &&
				$caracter != '*' && $caracter != '/' && $caracter != '.' &&
				!is_numeric($caracter)) {
				$campoPesquisa .= $caracter;
				$i++;
				$caracter = "";
				if (isset($valorPadrao[$i])) {
					$caracter = $valorPadrao[$i];
				}
				if ($i > strlen($valorPadrao)) break;
			}
			$campoPesquisa = trim($campoPesquisa);
			if ($campoPesquisa != "") {
				$expressao .= $this->recuperaValor($campoPesquisa);
			}
			$expressao .= $caracter;
			$i++;
		}
		//echo $expressao;
		@eval("\$valorExpressao = " . $expressao . ";");
		if ($valorExpressao == "") $valorExpressao = 0;
		//echo " = " . $valorExpressao . "<br/>";
		return $valorExpressao;
	}
	
	function recuperaValor($nomeCampo) {
		$valor = 0;
		if (strpos($nomeCampo, " do ") !== FALSE) {
			$valorComposto = explode(" do ", $nomeCampo);
			//echo "$nomeCampo..." . $valorComposto[1] . "...";
			$id = $this->recuperaValor(trim($valorComposto[1]));
			foreach ($this->tabela->campos as $campo) {
				if ($campo->nome == trim($valorComposto[1])) {
					$query = "SELECT `" . $valorComposto[0] . "` FROM `" . $campo->tipoConfig . "` WHERE id = " . $id;
					$result = mysql_query($query, $this->configBase->conn);
					$valor = @mysql_result($result, 0, 0);
				}
			}
		} else {
			foreach ($this->tabela->campos as $campo) {
				if ($campo->nome == $nomeCampo) {
					$valor = $campo->valor;
					break;					
				}
			}
		}
		//echo "$nomeCampo = " . $valor;
		return $valor;
	}
}
?>